home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / varia / silo.lha / silo / SimEventList.c < prev    next >
C/C++ Source or Header  |  1993-08-08  |  3KB  |  158 lines

  1. /* $Author: ecsv38 $ $Date: 90/08/21 14:46:06 $ $Revision: 1.1 $ */
  2. /* (c) S. Manoharan  sam@lfcs.edinburgh.ac.uk */
  3.  
  4. #include <stream.h>
  5.  
  6. #include "SimEventList.h"
  7.  
  8.  
  9. SimEventList::~SimEventList()
  10. {
  11.    SimEventItem *listnode = head;
  12.  
  13.    while ( listnode ) {
  14.       SimEventItem *temp = listnode;
  15.  
  16.       listnode = listnode->next;
  17.       delete temp;
  18.    }
  19.    head = tail = 0;
  20. }
  21.  
  22. void
  23. SimEventList::insert(Event *const event)
  24. {
  25.    SimEventItem *listnode = new SimEventItem(event);
  26.    listnode->next = head;
  27.    if ( head ) head->prev = listnode;
  28.    else tail = listnode;
  29.    head = listnode;
  30. }
  31.  
  32. void
  33. SimEventList::append(Event *const event)
  34. {
  35.    SimEventItem *listnode = new SimEventItem(event);
  36.    listnode->prev = tail;
  37.    if ( tail ) tail->next = listnode;
  38.    else head = listnode;
  39.    tail = listnode;
  40. }
  41.  
  42. Event *
  43. SimEventList::remove(const int eid)
  44. {
  45.    SimEventItem *listnode = head;
  46.    SimEventItem *temp;
  47.    Event * gotcha = 0;
  48.  
  49.    while ( listnode ) {
  50.       if ( (listnode->event)->id() == eid ) {
  51.      gotcha = listnode->event;
  52.      temp = listnode;
  53.          if ( listnode->prev != 0 )
  54.             (listnode->prev)->next = listnode->next;
  55.          else head = listnode->next;
  56.          if ( listnode->next != 0 )
  57.             (listnode->next)->prev = listnode->prev;
  58.      else tail = listnode->prev;
  59.          listnode = listnode->next;
  60.          delete temp;
  61.      break;
  62.       }
  63.       else listnode = listnode->next;
  64.    }
  65.    return gotcha;
  66. }
  67.  
  68. Event *
  69. SimEventList::remove(Entity *const ent)
  70. {
  71.    SimEventItem *listnode = head;
  72.    SimEventItem *temp;
  73.    Event * gotcha = 0;
  74.  
  75.    while ( listnode ) {
  76.       if ( (listnode->event)->scheduled_by() == ent ) {
  77.      gotcha = listnode->event;
  78.      temp = listnode;
  79.          if ( listnode->prev != 0 )
  80.             (listnode->prev)->next = listnode->next;
  81.          else head = listnode->next;
  82.          if ( listnode->next != 0 )
  83.             (listnode->next)->prev = listnode->prev;
  84.      else tail = listnode->prev;
  85.          listnode = listnode->next;
  86.          delete temp;
  87.      break;
  88.       }
  89.       else listnode = listnode->next;
  90.    }
  91.    return gotcha;
  92. }
  93.  
  94. int
  95. SimEventList::min_event_id()
  96. {
  97.    SimEventItem *listnode = head;
  98.  
  99.    if ( head == 0 ) return 0;
  100.  
  101.    double min = (head->event)->eventTime();
  102.    int eid = (head->event)->id();
  103.    while ( listnode ) {
  104.       if ( (listnode->event)->eventTime() < min ) {
  105.      min = (listnode->event)->eventTime();
  106.      eid = (listnode->event)->id();
  107.       }
  108.       listnode = listnode->next;
  109.    }
  110.    return eid;
  111. }
  112.  
  113. int
  114. SimEventList::max_event_id()
  115. {
  116.    SimEventItem *listnode = head;
  117.  
  118.    if ( head == 0 ) return 0;
  119.  
  120.    double max = (head->event)->eventTime();
  121.    int eid = (head->event)->id();
  122.    while ( listnode ) {
  123.       if ( (listnode->event)->eventTime() > max ) {
  124.      max = (listnode->event)->eventTime();
  125.      eid = (listnode->event)->id();
  126.       }
  127.       listnode = listnode->next;
  128.    }
  129.    return eid;
  130. }
  131.  
  132. void
  133. SimEventList::print()
  134. {
  135.    if ( listname != 0 ) cout << listname << ":\n";
  136.  
  137.    if ( head == 0 ) {
  138.       cout << "[ empty ]\n";
  139.       return;
  140.    }
  141.  
  142.    cout << "[ ";
  143.  
  144.    SimEventItem *listnode = head;
  145.    const int lineLength = 16;
  146.    int cnt = 0;
  147.    while ( listnode != 0 ) {
  148.       if ( ++cnt % lineLength == 1 && cnt != 1 )
  149.      cout << "\n  ";
  150.       /* print list->entry at this point */
  151.       cout << form("0x%x (%g) ",
  152.      (listnode->event)->id(), (listnode->event)->eventTime());
  153.       listnode = listnode->next;
  154.    }
  155.    cout << "]\n";
  156. }
  157.  
  158.